package concurrent;

import java.util.concurrent.TimeUnit;

/**
 * stop方法过于暴力，强制把正在执行的方法停止了
 * interrupt()方法是一个实例方法，它通知目标线程中断，也就是设置中断标志位为true，中断标志位表示当前线程已经被中断了。
 * isInterrupted()方法也是一个实例方法，它判断当前线程是否被中断（通过检查中断标志位）。
 * 最后一个方法interrupted()是一个静态方法，返回boolean类型，也是用来判断当前线程是否被中断，但是同时会清除当前线程的中断标志位的状态。
 *
 * @author jack.wu
 * @since 2019/12/25 15:41
 */
public class InterruptDemo {

    static {
        Thread thread = new Thread(() -> {
            while (true) {
                if (Thread.interrupted()) {
                    System.out.println("退出。。。");
                    break;
                }
            }
        });
        thread.start();
        try {
            TimeUnit.SECONDS.sleep(3);
            // 线程的中断标志将被置为true
            thread.interrupt();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        InterruptDemo demo = new InterruptDemo();

    }
}

/**
 * 这里强调一点，Object.wait()方法并不能随便调用。它必须包含在对应的synchronize语句汇总，
 * 无论是wait()方法或者notify()方法都需要首先获取目标独享的一个监视器。
 */
class WaitDemo {
    static Object object = new Object();

    public static class T1 extends Thread {
        @Override
        public void run() {
            synchronized (object) {
                System.out.println("T1开始：" + System.currentTimeMillis());
                try {
                    object.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("T1结束：" + System.currentTimeMillis());
            }
        }
    }

    public static class T2 extends Thread {
        @Override
        public void run() {
            synchronized (object){
                System.out.println("T2开始：" + System.currentTimeMillis());
                object.notify();
                System.out.println("T2结束：" + System.currentTimeMillis());
            }
        }
    }

    public static void main(String[] args) {
        new T1().start();
        new T2().start();
    }
}

/**
 * 即线程挂起(suspend)和继续执行(resume)
 * 系统不推荐使用suspend()方法去挂起线程是因为suspend()方法导致线程暂停的同时，并不会释放任何锁资源。
 */
class SuspendDemo{
    static Object object = new Object();
    public static class T1 extends Thread{

        @Override
        public void run() {
            synchronized(object){
                System.out.println("in - "+Thread.currentThread().getName());
                Thread.currentThread().suspend();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        T1 t1 = new T1();
        t1.setName("T1");
        t1.start();
        TimeUnit.SECONDS.sleep(2);
        T1 t2 = new T1();
        t2.setName("T2");
        t2.start();
        t1.resume();
        t2.resume();
        t1.join();
        t2.join();
    }
}
